#include "../head/basic_head.h"
#include "taskQueue.h"
#ifndef __SERVER__
#define __SERVER__

#define BIG_FILE 100 * 1024 * 1024
typedef struct train_s
{
    int length;
    char data[1024];
} train_t;

// 定义线程池
typedef struct threadPool_s
{
    // 所有子线程id
    pthread_t *threadIds;
    // 子线程的数量
    int threadNum;
    // 任务队列
    taskQueue_t taskQueue;
    // 退出标记
    // int exitFlag;
} threadPool_t;

// 动态加载配置文件config.ini中的的内容
int getparameter(char *key, char *value); // getparameter.c

// 初始化线程池
int initThreadPool(threadPool_t *pthreadPool, int threadNum); // initThreadPool.c
// 定义线程的入口函数
void *threadFunc(void *arg); // worker.c
// 初始化tcp连接
int initTcpSocket(int *socket_fd, char *ip, char *port); // initTcpSocket.c
// 添加描述符fd到epoll监听集合
int epollAddFD(int epoll_fd, int fd); // epoll.c
// 从epoll监听集合中删除描述符fd
int epollDelFD(int epoll_fd, int fd); // epoll.c

// 处理客户端发送的各种指令
int handle(int netfd, char *username, MYSQL *mysql);

// 用于查询file_table表中是否有指定hash值
int check_hash_existence(MYSQL *conn, const char *hash);
// 用于向file_table表中添加数据
int insert_file_table_record(MYSQL *conn, const char *filename, const char *file_type, const char *hash_value);
// 用于向all_user_file表中添加数据
int insert_all_user_file_record(MYSQL *conn, const char *file_name, const char *user_name, int parent_id, const char *file_path, const char *file_type, const char *hash_value);
// 用于在user_info表根据username中获取current_path。这个函数可以拿到头文件，给别的命令复用
char *get_current_path_by_username(MYSQL *conn, const char *username);
// 用于在all_user_file表中，根据user_name和filename获取id
int get_id_by_username_and_filename(MYSQL *conn, const char *user_name, const char *filename);

// 处理gets命令，即发送文件
int gets_work(int net_fd, char *user_name, MYSQL *mysql);
// 处理puts命令，即接收文件
int puts_work(int net_fd, char *user_name, MYSQL *mysql);
int pwd_work(int net_fd, char *user_name, MYSQL *mysql);
int ls_work(int net_fd, char *username, MYSQL *mysql);
int cd_work(int net_fd, char *username, MYSQL *mysql);
int remove_work(int net_fd, const char *username, MYSQL *mysql);

// 传入任意路径/文件，查询是否存在于file_table中
int check_file_existance(MYSQL *mysql, char *path, char *user_name);
// 查询path是否在表中
int is_path(MYSQL *mysql, char *path);
// 得到绝对路径
void getAbsolutePath(char *path);

#endif